home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Zoom 2
/
Zoom - Release 2 (1996)(Active Software)[!].iso
/
utilities
/
blankers
/
blitzblank_260
/
developer
/
modulesources
/
bb.plasma.bb2
< prev
next >
Wrap
Text File
|
1995-05-18
|
16KB
|
554 lines
; BB.Plasma v1.2 Module for BlitzBlank
; Written by Daniel Pink
;--------------------------------------------------------------------
; The different kinds of GUI-objects for a module's config-window
#BB_PGroup=1 ; Indicates the start of a new page group
#BB_PGroup_End=2 ; Indicates the end of the page group
#BB_VGroup=3 ; Indicates the start of a new vertical group
#BB_VGroup_End=4 ; Indicates the end of the vertical group
#BB_Check=5 ; Checkmark, uses set field in BB_Object
#BB_String=6 ; Textgadget, uses max/contents fields in BB_Object
#BB_File=7 ; Stringgadget with attached filerequester
#BB_Slider=8 ; Slidergadget, uses min/max/set fields in BB_Object
#BB_Cycle=9 ; Cyclegadget, uses set/contents in BB_Object
#BB_Dummy=10 ; Dummy, if you want no gadgets at all
#BB_Font=11 ; Stringgadget with attached fontrequester
#BB_Dir=12 ; Stringgadget with attached filerequester, Dirs only
;--------------------------------------------------------------------
; Flags used in BB_Message's flag-field
#BBF_Screenmode=1 LSL 0 ; Allows screenmode-selection
#BBF_colours=1 LSL 1 ; Allows screendepth-selection
#BBF_Sample=1 LSL 2 ; Not supported yet
#BBF_NoWatch=1 LSL 3 ; Eats no CPU-time, so needs no checking
#BBF_NoScreen=1 LSL 4 ; Wants no screen from BlitzBlank
#BBF_FirstScreen=1 LSL 5 ; Wants pointer to screen in front, be CAREFUL with this!
#BBF_CloneScreen=1 LSL 6 ; Wants a clone from the FrontScreen
#BBF_AmigaOnly=1 LSL 7 ; Not supported yet
#BBF_NoMouseBlank=1 LSL 8 ; No mouseblanking from BlitzBlank wanted
#BBF_NoKeyPass=1 LSL 9 ; No keypassing necessary (no mouseblanking, no own active window
#BBF_BigWindow=1 LSL 10 ; The blankwindow fills the whole screen
#BBF_Interleaved=1 LSL 11 ; BlitzBlank TRIES to give you a screen with an Interleaved BitMap
;--------------------------------------------------------------------
; The structure, that holds config-data
NEWTYPE .BB_Object
next_.l ;BB_Object ; Pointer to next object or NULL if last object
type_.w ; What kind of GUI-object this is
min_.l ; Minimum value for BB_Slider
max_.l ; Maximum value for BB_Slider, max length of BB_String
set_.l ; Value of BB_Slider, state of BB_Checkmark, BB_Cycle
contents_.l ; Pointer to buffer for BB_String, pointer to stringarray for BB_Cycle
label_.l ; Label for ALL objects
End NEWTYPE
;--------------------------------------------------------------------
; The message to send to BlitzBlank/BlitzBlankPrefs
NEWTYPE .BB_Message
msg_.Message ; Normal Exec-Message-structure
flags_.l ; Flags for this module
infotext_.l ; Pointer to infotext for this module
*first_.BB_Object ; Pointer to first BB_Object or NULL for Info-action
modpri_.w ; not of use, if you use the library
*path_.b ; Path to directory for module-data
*blitzblank_.Task ; not of use, if you use the library
End NEWTYPE
;--------------------------------------------------------------------
; The BlitzBlank-Screeninfo-structure
NEWTYPE .BB_Screeninfo
xpos_.w ; should be 0
ypos_.w ; should be 0
width_.w ; User-selected screen-width
height_.w ; User-selected screen-height
depth_.w ; User-selected screen-depth
mode_.l ; User-selected screen-mode
*bbscreen_.Screen ; module screen
*bbwindow_.Window ; blank window
mindepth_.w ; desired minimum depth or 0
maxdepth_.w ; desired maximum depth or 0
End NEWTYPE
;--------------------------------------------------------------------
; Flag-definition for BBL_AllocBitMap()/BBL_AllocRastPort,
; if you don't have the V39-includes
#BMB_CLEAR=0
#BMB_DISPLAYABLE=1
#BMB_INTERLEAVED=2
#BMF_CLEAR=1 LSL #BMB_CLEAR
#BMF_DISPLAYABLE=1 LSL #BMB_DISPLAYABLE
#BMF_INTERLEAVED=1 LSL #BMB_INTERLEAVED
;--------------------------------------------------------------------
; Locale string numbers
#PaletteStr1=600
#PaletteStr2=601
#PaletteStr3=602
#SpeedStr0=603
#SpeedStr1=604
#SpeedStr2=605
#SpeedStr3=606
#PaletteLabelStr=607
#SpeedLabelStr=608
#InfoStr=609
#BrightLabelStr=610
;--------------------------------------------------------------------
; Types for the AGA colourmap for LoadRGB23_
NEWTYPE .RGB
_Red.l
_Green.l
_Blue.l
End NEWTYPE
NEWTYPE .ColourMap32
_NumCols.w
_Zero.w
_RGB.RGB[256]
_Zero2.l
End NEWTYPE
;--------------------------------------------------------------------
; Type for non AGA colourmap for LoadRGB4_
NEWTYPE .ColourMap4
_NumCols.w
_Colours.w[256]
End NEWTYPE
;--------------------------------------------------------------------
; Type for lookup table to see how many VWaits and colour
; cycles to do for different speeds and bitmap depths.
NEWTYPE .Update
NoVWaits.b [7]
NoCycles.b [7]
End NEWTYPE
NEWTYPE .Brightness
Level39.b [5]
LevelPre39.b [5]
End NEWTYPE
DEFTYPE .Brightness *BrightnessTable
DEFTYPE .Update *UpdateRate
DEFTYPE .ColourMap32 MyColourMap32
DEFTYPE .ColourMap4 MyColourMap4
*UpdateRate=?UpdateRateLUT
*BrightnessTable=?BrightnessLUT
;--------------------------------------------------------------------
; Set a colour in the colourmap
Statement SetColour{N.w,R.w,G.w,B.w}
SHARED MyColourMap32,MyColourMap4,NumColours.w,V39.b
If N>=0 AND N<NumColours
If V39
MyColourMap32\_RGB[N]\_Red=R+(R LSL 8)+(R LSL 16)+(R LSL 24)
MyColourMap32\_RGB[N]\_Green=G+(G LSL 8)+(G LSL 16)+(G LSL 24)
MyColourMap32\_RGB[N]\_Blue=B+(B LSL 8)+(B LSL 16)+(B LSL 24)
Else
MyColourMap4\_Colours[N]=(R LSL 8)|(G LSL 4)|B
EndIf
EndIf
End Statement
;--------------------------------------------------------------------
; Initialise colourmap
Statement InitColourMap {}
SHARED MyColourMap32,MyColourMap4,NumColours,V39
If V39
MyColourMap32\_NumCols=NumColours
Else
MyColourMap4\_NumCols=NumColours
EndIf
End Statement
;--------------------------------------------------------------------
; Show the colours in the current colourmap
Statement ShowColours {}
SHARED MyColourMap32,MyColourMap4,NumColours,vp.l,V39
If V39
LoadRGB32_ vp,&MyColourMap32
Else
LoadRGB4_ vp,&MyColourMap4,NumColours
EndIf
End Statement
;--------------------------------------------------------------------
; Cycle the colours in the AGA colourmap
Statement CycleColours32 {PaletteAddress.l}
MOVEM.l d0-d3,-(a7)
MOVE.l d0,a0 ; a0 Points to .Palettedata
MOVE.w (a0),d0 ; d0 is number of colours
CMP.w #3,d0
BLE ExitCycleColours32
ADDA.l #16,a0
MOVE.l (a0)+,d1 ; store the first palette entry
MOVE.l (a0)+,d2 ; so that it can be put in the
MOVE.l (a0)+,d3 ; last entry when we get there
SUB.w #3,d0
CopyNext32:
; Copy palette entries to the previous entry
MOVE.l (a0)+,-16(a0)
MOVE.l (a0)+,-16(a0)
MOVE.l (a0)+,-16(a0)
DBRA d0,CopyNext32:
SUBA #12,a0
; Copy the first entry to the last entry
MOVE.l d1,(a0)+
MOVE.l d2,(a0)+
MOVE.l d3,(a0)
ExitCycleColours32:
MOVEM.l (a7)+,d0-d3
AsmExit
End Statement
;--------------------------------------------------------------------
; Cycle the colours in the non AGA colourmap
Statement CycleColours4 {PaletteAddress.l}
MOVE.l d0,a0 ; a0 Points to .Palettedata
MOVE.w (a0),d0 ; d0 is number of colours
CMP.w #3,d0
BLE ExitCycleColours4
ADDA.l #2,a0
MOVE.w (a0)+,d1 ; store the first palette entry
SUB.w #3,d0
CopyNext4:
; Copy palette entries to the previous entry
MOVE.w (a0)+,-4(a0)
DBRA d0,CopyNext4:
; Copy the first entry to the last entry
MOVE.w d1,-2(a0)
ExitCycleColours4:
AsmExit
End Statement
;--------------------------------------------------------------------
Statement InitPlasmaPalette{}
SHARED NumColours.w,V39,Bright.b
ColsD3.w=NumColours/3
If V39
SetColour{0,0,Int(Bright/ColsD3),Bright}
For i=1 To ColsD3
SetColour{i,0,Int(((i*Bright)/ColsD3)+0.5),Int(((ColsD3+1-i)*Bright)/ColsD3)}
SetColour{i+ColsD3,Int((i*Bright)/ColsD3),Int(((ColsD3+1-i)*Bright)/ColsD3),0}
SetColour{i+ColsD3+ColsD3,Int(((ColsD3+1-i)*Bright)/ColsD3),0,Int((i*Bright)/ColsD3)}
Next i
Else
SetColour{0,0,Int(Bright/ColsD3),Bright}
For i=1 To ColsD3
SetColour{i,0,Int((i*Bright)/ColsD3),Int(((ColsD3+1-i)*Bright)/ColsD3)}
SetColour{i+ColsD3,Int((i*Bright)/ColsD3),Int(((ColsD3+1-i)*Bright)/ColsD3),0}
SetColour{i+ColsD3+ColsD3,Int(((ColsD3+1-i)*Bright)/ColsD3),0,Int((i*Bright)/ColsD3)}
Next i
EndIf
End Statement
;--------------------------------------------------------------------
Statement InitCloudPalette{}
SHARED NumColours,V39,Bright
ColsD2.w=NumColours/2
If V39
For i=0 To NumColours
SetColour{i,Int((Abs(i-ColsD2)*Bright)/ColsD2),Int((Abs(i-ColsD2)*Bright)/ColsD2),Bright}
Next i
Else
For i=0 To NumColours
SetColour{i,Int(0.5+((Abs(i-ColsD2)*Bright)/ColsD2)),Int(0.5+(Abs(i-ColsD2)*Bright)/ColsD2),Bright}
Next i
EndIf
End Statement
;--------------------------------------------------------------------
Statement InitElectricPalette {}
SHARED NumColours,V39,Bright
Threshold.w=NumColours/12
If V39
For i=0 To NumColours
If(i<=Threshold)
SetColour{i,Int((((Threshold-i)/Threshold)*Bright)+0.5),Int((((Threshold-i)/Threshold)*Bright/3)+0.5),Bright/2}
Else
SetColour{i,0,0,0}
EndIf
Next i
Else
If NumColours=32
SetColour{0,Bright-1,Bright-2,Bright-2}
SetColour{1,0,0,Bright/2}
For i=2 To 32
SetColour{i,0,0,0}
Next i
Else
For i=0 To NumColours
If(i<=Threshold)
SetColour{i,Int(((Threshold-i)/Threshold)*Bright),Int(((Threshold-i)/Threshold)*Bright/2),Bright/2}
Else
SetColour{i,0,0,0}
EndIf
Next i
EndIf
EndIf
End Statement
;--------------------------------------------------------------------
; Recursive procedure used to draw colours to a
; section of the bitmap bounded by (x1,y1) and (x2,y2)
Statement Sub_Divide{ x1.w, y1.w, x2.w, y2.w}
SHARED Exit.b,rp.l,NumColours
If NOT(Exit)
x.w=(x1+x2)/2
y.w=(y1+y2)/2
Col1.w=ReadPixel_(rp,x1,y1)
Col2.w=ReadPixel_(rp,x2,y1)
Col3.w=ReadPixel_(rp,x1,y2)
Col4.w=ReadPixel_(rp,x2,y2)
If ReadPixel_(rp,x,y1)=0
Col.w=Abs(x1-x2)
Col.w=Int(Rnd(Col*2)-Col)+(Col1+Col2)/2
If (Col<1) Then Col=1 Else If (Col>NumColours) Then Col=NumColours
SetAPen_ rp,Col
WritePixel_ rp,x,y1
EndIf
If ReadPixel_(rp,x2,y)=0
Col.w=Abs(y1-y2)
Col.w=Int(Rnd(Col*2)-Col)+(Col2+Col4)/2
If (Col<1) Then Col=1 Else If (Col>NumColours) Then Col=NumColours
SetAPen_ rp,Col
WritePixel_ rp,x2,y
EndIf
If ReadPixel_(rp,x,y2)=0
Col.w=Abs(x1-x2)
Col.w=Int(Rnd(Col*2)-Col)+(Col3+Col4)/2
If (Col<1) Then Col=1 Else If (Col>NumColours) Then Col=NumColours
SetAPen_ rp,Col
WritePixel_ rp,x,y2
EndIf
If ReadPixel_(rp,x1,y)=0
Col.w=Abs(y1-y2)
Col.w=Int(Rnd(Col*2)-Col)+(Col1+Col3)/2
If (Col<1) Then Col=1 Else If (Col>NumColours) Then Col=NumColours
SetAPen_ rp,Col
WritePixel_ rp,x1,y
EndIf
Col.w=(Col1+Col2+Col3+Col4+2)/4
SetAPen_ rp,Col
WritePixel_ rp,x,y
Width1.b=x-x1>1
Width2.b=x2-x>1
Width3.b=y-y1>1
Width4.b=y2-y>1
If Width1 OR Width3 Then Sub_Divide{x1, y1, x, y }
If Width2 OR Width3 Then Sub_Divide{x, y1, x2, y }
If Width1 OR Width4 Then Sub_Divide{x1, y, x, y2}
If Width2 OR Width4 Then Sub_Divide{x, y, x2, y2}
End If
End Statement
;--------------------------------------------------------------------
; Data for palette cycle gadget
Dim PaletteCycle.l(3)
PaletteCycle(0)=BBL_GetString_ (#PaletteStr1,?_Palette1)
PaletteCycle(1)=BBL_GetString_ (#PaletteStr2,?_Palette2)
PaletteCycle(2)=BBL_GetString_ (#PaletteStr3,?_Palette3)
PaletteCycle(3)=0
;--------------------------------------------------------------------
; Data for cycle speed cycle gadget
Dim SpeedCycle.l(4)
SpeedCycle(0)=BBL_GetString_ (#SpeedStr0,?Speed0)
SpeedCycle(1)=BBL_GetString_ (#SpeedStr1,?Speed1)
SpeedCycle(2)=BBL_GetString_ (#SpeedStr2,?Speed2)
SpeedCycle(3)=BBL_GetString_ (#SpeedStr3,?Speed3)
SpeedCycle(4)=0
;--------------------------------------------------------------------
; MUI objects for preferences
Dim Objects.BB_Object(4)
Objects(0)\next_=&Objects(1),#BB_VGroup,0,0,0,0,0
Objects(1)\next_=&Objects(2),#BB_Cycle,0,0,0,&PaletteCycle(0),BBL_GetString_(#PaletteLabelStr,?PaletteLabel)
Objects(2)\next_=&Objects(3),#BB_Cycle,0,0,0,&SpeedCycle(0),BBL_GetString_(#SpeedLabelStr,?SpeedLabel)
Objects(3)\next_=&Objects(4),#BB_Slider,0,4,0,0,BBL_GetString_(#BrightLabelStr,?BrightLabel)
Objects(4)\next_=0,#BB_VGroup_End,0,0,0,0,0
DEFTYPE .BB_Message Message
DEFTYPE .BB_Screeninfo *ScreenInfo
DEFTYPE .Screen *MyScreen
;--------------------------------------------------------------------
; Construct message to return to BlitzBlank
Message\first_=&Objects(0)
Message\infotext_=BBL_GetString_(#InfoStr,?InfoMessage)
Message\flags_=#BBF_Screenmode+#BBF_colours
;--------------------------------------------------------------------
; Get pointer to screeninfo
StrToLong_ Par$(3),&*ScreenInfo
*ScreenInfo\mindepth_=5
;--------------------------------------------------------------------
; Check which action to do
Select Par$(1)
Case "BLANK"
BBL_SendMessage_ &Message,Par$(2)
*MyScreen=*ScreenInfo\bbscreen_
If *MyScreen<>0
ScreenToFront_ *MyScreen
BBL_ModuleRunning_
Speed.b=*ScreenInfo\depth_-(Objects(2)\set_+2)
Gosub SetInterrupt ; Interrupt used to stop while drawing
vp.l=*MyScreen\_ViewPort
rp.l=*MyScreen\_RastPort
Choice.b=Objects(1)\set_
NumColours.w=1LSL*ScreenInfo\depth_
Bright.b=Objects(3)\set_
If ExecVersion=39
V39=True
Else
V39=False
EndIf
If V39
Bright=*BrightnessTable\Level39[Bright]
Else
Bright=*BrightnessTable\LevelPre39[Bright]
EndIf
InitColourMap {}
Select Choice.b
Case 1
InitCloudPalette{}
Case 2
InitElectricPalette{}
Default
InitPlasmaPalette{}
End Select
ShowColours {}
SetAPen_ rp,Int(Rnd(NumColours)+1)
WritePixel_ rp,0,0
SetAPen_ rp,Int(Rnd(NumColours)+1)
WritePixel_ rp,*ScreenInfo\width_-1, 0
SetAPen_ rp,Int(Rnd(NumColours)+1)
WritePixel_ rp,*ScreenInfo\width_-1, *ScreenInfo\height_-1
SetAPen_ rp,Int(Rnd(NumColours)+1)
WritePixel_ rp,0, *ScreenInfo\height_-1
Sub_Divide{0, 0, *ScreenInfo\width_-1, *ScreenInfo\height_-1}
ClrInt 5 ; Finished drawing, so don't need interrupt
If NOT Exit
While CheckSignal_(#SIGBREAKF_CTRL_C)<>#SIGBREAKF_CTRL_C
For Counter.b=1 To *UpdateRate\NoVWaits[Speed]
WaitTOF_
Next Counter
For Counter=1 To *UpdateRate\NoCycles[Speed]
If V39
CycleColours32 {&MyColourMap32}
Else
CycleColours4 {&MyColourMap4}
EndIf
Next Counter
ShowColours{}
Wend
EndIf
EndIf
BBL_BlankDone_
Case "CONFIG"
BBL_SendMessage_ &Message,Par$(2)
Case "INFO"
Message\first_=0
BBL_SendMessage_ &Message,Par$(2)
End Select
End
;--------------------------------------------------------------------
.SetInterrupt
Exit.b=False
SetInt 5
If CheckSignal_(#SIGBREAKF_CTRL_C)=#SIGBREAKF_CTRL_C Then Exit=True
End SetInt
Return
;--------------------------------------------------------------------
; Default strings
._Palette1:
Dc.b "Plasma",0
._Palette2:
Dc.b "Clouds",0
._Palette3:
Dc.b "Electrical",0
.PaletteLabel:
Dc.b "Palette T_ype",0
.SpeedLabel:
Dc.b "Colour Cycle _Rate",0
.Speed0:
Dc.b "Very Fast",0
.Speed1:
Dc.b "Fast",0
.Speed2:
Dc.b "Medium",0
.Speed3:
Dc.b "Slow",0
.InfoMessage:
Dc.b 27,"c",27,"bPlasma",27,"n v1.2",10,10
Dc.b "Module for BlitzBlank",10,10
Dc.b "Copyright 1995",10
Dc.b "By",10
Dc.b "Daniel Pink",10,0
.BrightLabel:
Dc.b "_Brightness",0
;--------------------------------------------------------------------
; Lookup table for number of VWaits and Cycles
.UpdateRateLUT
Dc.b 8, 5, 3, 2, 1, 1, 1
Dc.b 1, 1, 1, 1, 1, 2, 3
.BrightnessLUT
Dc.b 63,80,96,112,127
Dc.b 4,5,6,7,8
Even